package com.ruoyi.system.service.impl;

import java.util.List;
import java.util.concurrent.CompletableFuture;

import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.system.domain.BkArticle;
import com.ruoyi.system.domain.BkHome;
import com.ruoyi.system.service.IBkEmailService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.system.mapper.BkCommentMapper;
import com.ruoyi.system.domain.BkComment;
import com.ruoyi.system.service.IBkCommentService;
import org.springframework.transaction.annotation.Transactional;

/**
 * 文章评论Service业务层处理
 * 
 * @author ruoyi
 * @date 2025-02-19
 */
@Service
public class BkCommentServiceImpl implements IBkCommentService 
{
    @Autowired
    private IBkEmailService emailService; // 注入实例对象
    @Autowired
    private BkCommentMapper bkCommentMapper;

    /**
     * 查询文章评论
     * 
     * @param commentId 文章评论主键
     * @return 文章评论
     */
    @Override
    public BkComment selectBkCommentByCommentId(Long commentId)
    {
        return bkCommentMapper.selectBkCommentByCommentId(commentId);
    }

    /**
     * 查询文章评论列表
     *
     * @param bkComment 文章评论
     * @return 文章评论
     */
    @Override
    public List<BkComment> selectBkCommentList(BkComment bkComment)
    {
        return bkCommentMapper.selectBkCommentList(bkComment);
    }

    /**
     * 新增文章评论
     * @param bkComment 文章评论
     * @return 结果
     */
    @Override
    @Transactional // 开启事务保障原子性
    public int insertBkComment(BkComment bkComment) {
        // 设置创建时间
        bkComment.setCreateTime(DateUtils.getNowDate());

        /*
         * 楼层号生成逻辑：
         * 1. 使用SELECT FOR UPDATE锁定当前文章相关记录，防止并发冲突
         * 2. 查询当前文章的最大楼层号
         * 3. 新楼层号 = 最大楼层号 + 1
         */
        // 获取当前文章ID
        Long articleId = bkComment.getArticleId();

        // 获取当前文章的最大楼层号并锁定（关键并发控制）
        Long maxFloor = bkCommentMapper.selectMaxFloorWithLock(articleId);

        // 计算新楼层号（若没有历史评论则从1开始）
        Long newFloor = (maxFloor == null) ? 1L : maxFloor + 1L;
        bkComment.setFloor(newFloor);

        // 插入评论记录
        int rows = bkCommentMapper.insertBkComment(bkComment);

        // 检查是否为回复评论（有parentId）
        if (bkComment.getParentId() != null && bkComment.getParentId() > 0) {
            // 获取被回复的评论信息
            BkComment parentComment = bkCommentMapper.selectBkCommentByCommentId(bkComment.getParentId());

            // 设置父评论的楼层号到parentFloor字段
            if (parentComment != null) {
                bkComment.setParentFloor(parentComment.getFloor());
                // 更新刚插入的评论记录，添加parentFloor信息
                bkCommentMapper.updateBkComment(bkComment);
            }

            // 检查被回复评论是否存在且有邮箱
            if (parentComment != null && StringUtils.isNotEmpty(parentComment.getAuthorEmail())) {
                // 获取文章信息，用于邮件内容
                BkComment article = bkCommentMapper.selectBkCommentByCommentId(bkComment.getCommentId());

                // 构建邮件内容
                String emailSubject = "您在博客文章《" + article.getArticleTitle() + "》的评论收到了新回复";

                // 使用HTML模板构建邮件正文
                StringBuilder emailContent = new StringBuilder();
                emailContent.append("<div style='font-family: Arial, sans-serif; max-width: 600px; margin: 0 auto; padding: 20px; border: 1px solid #e0e0e0; border-radius: 5px;'>");
                emailContent.append("<h2 style='color: #333; border-bottom: 1px solid #eee; padding-bottom: 10px;'>评论回复通知</h2>");

                // 收件人信息
                String recipientName = StringUtils.isNotEmpty(parentComment.getAuthorWebsite()) ?
                        parentComment.getAuthorWebsite() : "博客访客";
                emailContent.append("<p>亲爱的 <strong>").append(recipientName).append("</strong>：</p>");

                // 原始评论信息
                emailContent.append("<p>您在文章《").append((article.getArticleTitle()))
                        .append(article.getArticleTitle()).append("</a>》中发表的评论：</p>");

                emailContent.append("<div style='background-color: #f9f9f9; padding: 15px; border-left: 4px solid #ddd; margin: 15px 0;'>");
                emailContent.append("<p>").append(parentComment.getContent()).append("</p>");
                emailContent.append("<p style='color: #666; font-size: 12px; text-align: right;'>— 您的评论 (楼层 #")
                        .append(parentComment.getFloor()).append(")</p>");
                emailContent.append("</div>");

                // 新回复信息
                String replierName = StringUtils.isNotEmpty(bkComment.getAuthorWebsite()) ?
                        bkComment.getAuthorWebsite() : "匿名用户";
                emailContent.append("<p>收到了来自 <strong>").append(replierName).append("</strong> 的回复：</p>");

                emailContent.append("<div style='background-color: #f5f5f5; padding: 15px; border-left: 4px solid #007bff; margin: 15px 0;'>");
                emailContent.append("<p>").append(bkComment.getContent()).append("</p>");
                emailContent.append("<p style='color: #666; font-size: 12px; text-align: right;'>— 回复于 ")
                        .append(DateUtils.parseDateToStr("yyyy-MM-dd HH:mm", bkComment.getCreateTime()))
                        .append(" (楼层 #").append(bkComment.getFloor()).append(")</p>");
                emailContent.append("</div>");

                // 查看链接
                emailContent.append("<p style='margin-top: 25px;'>");
                emailContent.append("</p>");

                // 底部信息
                emailContent.append("<p style='margin-top: 30px; font-size: 12px; color: #666; border-top: 1px solid #eee; padding-top: 10px;'>");
                emailContent.append("此邮件由系统自动发送，请勿直接回复。如有任何问题，<a href='www.baidu.com'>请访问我们的博客网站www.baidu.com</a>。");
                emailContent.append("</p>");
                emailContent.append("</div>");

                // 异步发送邮件，避免影响评论提交的响应速度
                CompletableFuture.runAsync(() -> {
                    try {
                        emailService.sendHtmlMail(parentComment.getAuthorEmail(), emailSubject, emailContent.toString());

                        // 记录邮件发送成功日志
                        System.out.println("成功发送评论回复通知邮件至: {}, 文章ID: {}, 评论ID: {}");

                    } catch (Exception e) {
                        // 记录邮件发送失败日志，但不影响评论提交
                        System.out.println("评论回复通知邮件发送失败: {}, 接收者: {}, 文章ID: {}");
                    }
                });
            }
        }

        return rows;
    }

    /**
     * 修改文章评论
     * 
     * @param bkComment 文章评论
     * @return 结果
     */
    @Override
    public int updateBkComment(BkComment bkComment)
    {
        return bkCommentMapper.updateBkComment(bkComment);
    }

    /**
     * 批量删除文章评论
     * 
     * @param commentIds 需要删除的文章评论主键
     * @return 结果
     */
    @Override
    public int deleteBkCommentByCommentIds(Long[] commentIds)
    {
        return bkCommentMapper.deleteBkCommentByCommentIds(commentIds);
    }

    /**
     * 删除文章评论信息
     * 
     * @param commentId 文章评论主键
     * @return 结果
     */
    @Override
    public int deleteBkCommentByCommentId(Long commentId)
    {
        return bkCommentMapper.deleteBkCommentByCommentId(commentId);
    }
}
